﻿using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.Collections.Generic;

namespace HabraReader
{
    public class SettingsData
    {
        public String URL;// URL - откуда брать посты
        public Int32 UpdateTime;// Время в минутах, через которое страница обновится
        public Boolean EnableAutoUpdate;// Включить автообновление?
        public Boolean ShowNotice;// Показывать уведомление в трее о обновлении?
    }
    
    class AppSettings// Класс для управления настройками
    {
        private static XmlSerializer Serializer = null;// Сериализатор
        private static TextWriter TW = null;// Поток вывода
        private static TextReader TR = null;// Поток ввода
        //Стандартные настройки
        private static SettingsData DefaultSettings = new SettingsData() { URL = "http://habrahabr.ru/top/", UpdateTime = 10, EnableAutoUpdate = true, ShowNotice = true };
        public static SettingsData Settings = null;// Настройки

        public static void CreateSettingsFile()// Создать пустой файл
        {
            // Создаём новый файл конфигурации
            FileStream fs = new FileStream("settings.xml",FileMode.Create,FileAccess.ReadWrite);
            fs.Close();
        }

        private static void SetDefaultSettings()// Метод для установки стандартного конфига
        {
            Settings = DefaultSettings;
        }

        public static void Save()// Сохранить конфиг
        {
            Serializer = new XmlSerializer(typeof(SettingsData));// Сериализатор
            CreateSettingsFile();// Создаём пустой конфиг, если он уже существовал то будет перезаписан
            TW = new StreamWriter("settings.xml");// Поток для записи
            if (Settings == null)// Если загруженные настройки пусты, то записываются стандартные настройки
            {
                Serializer.Serialize(TW, DefaultSettings);
            }
            else
            {
                Serializer.Serialize(TW,Settings);
            }
            TW.Close();// Закрывает поток
            Serializer = null;// Нуллим сериализатор
        }

        public static void Load()// Загрузить конфиг
        {
            Serializer = new XmlSerializer(typeof(SettingsData));
            if (!File.Exists("settings.xml"))// если файл не найден, то применим дефолтные настройки
            {
                SetDefaultSettings();
            }
            else
            {
                try
                {
                    TR = new StreamReader("settings.xml", Encoding.UTF8);
                    Settings = (SettingsData)Serializer.Deserialize(TR);                    
                }
                catch (InvalidOperationException)
                {
                    Box.ShowWarningMessage("Settings error!", "Невозможно загрузить файл конфигурации.\nУстановлены стандартные настройки!");
                    SetDefaultSettings();
                }
                catch (IOException)
                {
                    Box.ShowWarningMessage("Settings error!", "Невозможно загрузить файл конфигурации.\nУстановлены стандартные настройки!");
                    SetDefaultSettings();
                }
                finally// Без финалли поток не закроется => при выходе приложение не сможет получить доступ к файлу
                {
                    TR.Close();
                }
            }                        
        }
    }
}
